package algorithm.middle;


import java.util.ArrayList;
import java.util.List;

/**
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * <p>
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 * <p>
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * <p>
 * 输入：s = "PAYPALISHIRING", numRows = 4
 * 输出："PINALSIGYAHRPI"
 * 解释：
 * P     I    N
 * A   L S  I G
 * Y A   H R
 * P     I
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/zigzag-conversion
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Convert1511 {

    public static String convert(String s, int numRows) {
        int len = s.length();
        if (numRows == 1) return s;
        int num = numRows * 2 - 2;
        int lie = (len / num + 1) * (numRows - 1);
        char[][] chars = new char[numRows][lie];
        int i = 0, j = 0;
        boolean turn = false;
        StringBuilder res = new StringBuilder();
        for (int index = 0; index < s.length(); index++) {
            chars[i][j] = s.charAt(index);
            if (i + 1 == numRows) {
                turn = true;
            } else if (i - 1 == -1) {
                turn = false;
            }
            if (turn) {
                //斜着
                i--;
                j++;
            } else {
                //竖着
                i++;
            }
        }
        for (char[] arr : chars) {
            for (char c : arr) {
                if (c != '\u0000') {
                    res.append(c);
                }
                System.out.print(c);
            }
            System.out.println();
        }
        return res.toString();
    }

    public static void main(String[] args) {
        convert("PAYPALISHIRING", 3);
    }

    /**
     *     链接：https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/
     *     数组模拟，牛
     * @param s
     * @param numRows
     * @return
     */
    public String convert2(String s, int numRows) {
        if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            rows.get(i).append(c);
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }


}
